const { verifyLoginName, changePwd } = require('../service/login.service.js');
const { md5Password } = require('../utils/password-encrypt');
const { PRIVATE_KEY, PUBLIC_KEY } = require('../app/config');
const jwt = require('jsonwebtoken');

class LoginController {
  // 验证登录
  async verifyLogin(ctx, next) {
    const { name, password } = ctx.request.body;
    
    // 缺少name或者password字段
    if (!name || !password) {
      const error = new Error('1000 [login.controller]');
      return ctx.app.emit('error', error, ctx);
    }

    // 验证是否用户名和密码是否正确
    const newPassword = md5Password(password);
    const result = await verifyLoginName(name, newPassword);
    console.log('[login.controller]验证用户名和密码是否正确', result);
    if (result.length === 0) {
      const error = new Error('1003 [login.controller]');
      return ctx.app.emit('error', error, ctx);
    }
    ctx.user = result[0];

    await next();
  }

  // 登录生成token并返回
  async login(ctx, next) {
    const { id, name } = ctx.user;

    // 1、获取token
    const token = jwt.sign({ id, name }, PRIVATE_KEY, {
      expiresIn: '3h', // 设置token过期时间，不带单位即默认单位为ms
      algorithm: 'RS256' // 设置加密的方式，此处用的是非对称式加密，默认为HS256
    });

    // 将token返回给用户
    ctx.body = {
      ret: 0,
      data: {
        id,
        name,
        token
      }
    };
  }

  // 验证token
  async verifyToken(ctx, next) {
    const token = ctx.headers.token;
    if (!token) {
      const error = new Error('2000 [login.controller_no_token]');
      return ctx.app.emit('error', error, ctx);
    }
    try {
      const result = jwt.verify(token, PUBLIC_KEY, {
        algorithm: ['RS256'], // 解密方式 和加密相同
      });
      console.log('[login.controller]校验token有效性', result);
      ctx.user = result;
      await next();
    }catch (err) {
      console.log(err);
      const error = new Error('2000 [login.controller_token_error]');
      ctx.app.emit('error', error, ctx);
    }
  }

  // 修改密码
  async changePwd(ctx, next) {
    try {
      const { oldPwd, newPwd, confirmPwd } = ctx.request.body;
      if (newPwd !== confirmPwd) {
        const error = new Error('1005 [login.controller_changePwd]');
        return ctx.app.emit('error', error, ctx);
      }
      // 将传入的旧密码进行md5加密
      const oldPwdChange = md5Password(oldPwd);
      // 获取用户名和密码输入是否正确
      const result = await verifyLoginName(ctx.user.name, oldPwdChange);
      if (result.length === 0) {
        const error = new Error('1006 [login.controller——changePwd]');
        return ctx.app.emit('error', error, ctx);
      }
      const changePwdResult = await changePwd(ctx.user.name, oldPwdChange, md5Password(newPwd));
      if (!changePwdResult) return;
      ctx.body = {
        ret: 0,
        data: 'ok'
      }
    } catch(e) {
      console.log('[login.controller_changePwd]{fail}', e);
    }
  }
}

module.exports = new LoginController();